#include <odb/database.hxx>
#include <odb/mysql/transaction.hxx>
#include <odb/mysql/database.hxx>

#include "student.h"
#include "student-odb.hxx"

const std::string HOST = "192.168.65.130";  // 数据库服务器 IP 地址
const std::string USER = "root";            // 数据库用户名
const std::string PASS = "123456";          // 数据库密码
const std::string DBNAME = "mytest";        // 要连接的数据库名
const unsigned int PORT = 3306;             // MySQL 端口（默认 3306）
const std::string CSET = "utf8";            // 字符集（UTF-8 支持中文）

//分组统计函数 group_count
void group_count(std::unique_ptr<odb::mysql::database> &handler) {
	try {
		odb::transaction tx(handler->begin());
		//启用 SQL 跟踪（调试用）
		 // 将生成的 SQL 语句输出到标准错误流（控制台）
		tx.tracer(odb::stderr_full_tracer);
		auto &db = tx.database();
		typedef odb::query<GroupCount> Query;   // 定义查询类型（关联到 GroupCount 视图）
		typedef odb::result<GroupCount> Result; // 定义查询结果类型（存储查询返回的数据）
		Result res(db.query<GroupCount>("avg_score>70"));// 执行查询：筛选平均分 >70 的班级
		for (auto it = res.begin(); it != res.end(); ++it) {
            std::cout << "班级:" << it->classes_id << "\t";
            std::cout << "总人数:" << it->total_stu << "\t";
            std::cout << "平均分:" << it->avg_score << std::endl;
        }
		tx.commit();
	} catch(odb::exception &e) {
		std::cout << "odb error: " << e.what() << std::endl;
	}
}

int main()
{
	// 1. 构造连接池
	std::unique_ptr<odb::mysql::connection_factory> 
		pool(new odb::mysql::connection_pool_factory(5));
	// 2. 构造数据库操作句柄
	auto handler = std::make_unique<odb::mysql::database>
		(USER, PASS, DBNAME, HOST, PORT, nullptr, CSET, 0, std::move(pool));
	// 3. 数据操作 
    group_count(handler);
	return 0;
}